package com.reservation.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.reservation.dto.ExhibitionReservationDTO;
import com.reservation.entity.ExhibitionReservation;

import java.time.LocalDate;
import java.util.List;

/**
 * 展览预约服务接口
 */
public interface ExhibitionReservationService {
    
    /**
     * 创建展览预约
     *
     * @param reservation 预约信息
     * @return 创建成功的预约信息
     */
    ExhibitionReservation createReservation(ExhibitionReservation reservation);
    
    /**
     * 更新预约状态
     *
     * @param id     预约ID
     * @param status 预约状态
     * @return 更新后的预约信息
     */
    ExhibitionReservation updateReservationStatus(Long id, String status);
    
    /**
     * 获取预约详情
     *
     * @param id 预约ID
     * @return 预约信息
     */
    ExhibitionReservation getReservationById(Long id);
    
    /**
     * 取消预约
     *
     * @param id 预约ID
     * @return 是否成功
     */
    boolean cancelReservation(Long id);
    
    /**
     * 分页查询用户的预约列表
     *
     * @param page   分页参数
     * @param userId 用户ID
     * @param status 预约状态（可选）
     * @return 预约列表
     */
    IPage<ExhibitionReservation> getUserReservations(Page<ExhibitionReservation> page, Long userId, String status);
    
    /**
     * 分页查询展览的预约列表
     *
     * @param page        分页参数
     * @param exhibitionId 展览ID
     * @param status      预约状态（可选）
     * @param date        预约日期（可选）
     * @return 预约列表
     */
    IPage<ExhibitionReservation> getExhibitionReservations(Page<ExhibitionReservation> page, Long exhibitionId, String status, LocalDate date);
    
    /**
     * 分页查询所有预约列表（管理员使用）
     *
     * @param page        分页参数
     * @param status      预约状态（可选）
     * @return 预约列表
     */
    IPage<ExhibitionReservation> getAllReservations(Page<ExhibitionReservation> page, String status);
    
    /**
     * 检查用户在指定日期是否已有预约
     *
     * @param userId 用户ID
     * @param exhibitionId 展览ID
     * @param date   预约日期
     * @return 是否已有预约
     */
    boolean checkUserHasReservation(Long userId, Long exhibitionId, LocalDate date);
    
    /**
     * 获取用户的所有预约
     *
     * @param userId 用户ID
     * @return 预约列表
     */
    List<ExhibitionReservation> getUserAllReservations(Long userId);
    
    /**
     * 获取展览的所有预约
     *
     * @param exhibitionId 展览ID
     * @return 预约列表
     */
    List<ExhibitionReservation> getExhibitionAllReservations(Long exhibitionId);

    boolean confirmReservation(Long id);
}